#ifndef _FUNC_AUX_
#define _FUNC_AUX_

#include "prototipo.h"
#include "cto_prototipo.h"

/* Copyright 2010 Antonio Ruano Cuesta
 *
 * This program is free software: you can redistribute it and/or modify it under 
 * the terms of the GNU General Public License as published by the Free Software 
 * Foundation, either version 3 of the License, or (at your option) any later 
 * version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT 
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with 
 * this program. If not, see <http://www.gnu.org/licenses/>
*/

/**
 * @brief Calcula la posicion en la que se encuentra el maximo de un vector. En caso de haber 
 * varios maximos devuelve una posicion aleatoria de entre las que se encuentren dichos maximos.
 * @param v: vector en el que se ha de buscar la posicion maxima.
 * @param util_v: numero de componentes del vector.
 * @return Posicion en la que se encuentra el maximo valor del vector.
*/
unsigned int PosMaximo (unsigned int *v, int util_v);

/**
 * @brief Calcula el maximo elemento de un vector.
 * @param v: vector en el que se ha de buscar el maximo.
 * @param util_v: numero de componentes del vector.
 * @return Maximo valor del vector.
*/
unsigned int Maximo (unsigned int *v, int util_v);

/**
 * @brief Intercambia el valor de dos enteros (sin signo).
 * @param n1: primer entero (se modifica).
 * @param n2: segundo entero (se modifica).
*/
void IntercambiarEnteros (unsigned int &n1, unsigned int &n2);

/**
 * @brief Intercambia el valor de dos flotantes.
 * @param n1: primer flotante (se modifica).
 * @param n2: segundo flotante (se modifica).
*/
void IntercambiarFloat (float &n1, float &n2);

/**
 * @brief Hace una busqueda secuencial de un elemento en el intervalo dado.
 * @param v: vector en el que se hace la busqueda secuencial.
 * @param i: extremo inferior del intervalo.
 * @param j: extremo superior del intervalo.
 * @pre i < j. 
 *		i & j deben ser valores que constituyan un intervalo válido considerando el numero 
 *		de componentes del vector v.	
 * @return En caso de encontrarse el elemento devuelve la posicion, en otro caso -1.
*/
int BuscaSec_intervalo (unsigned int *v, int i, int j, unsigned int valor);

/**
 * @brief Calcula la moda de un vector.
 * @param v: vector en el que se ha de calcular la moda.
 * @param util_v: numero de componentes del vector.
 * @param util_repetidos: numero de componentes del vector de repetidos (util para el calculo 
 * de la moda).
 * @return Moda del vector (valor que se repite mas veces).
*/
unsigned int Moda (unsigned int *v, int util_v, unsigned int util_repetidos);

/**
 * @brief Calcula la distancia euclidea (al cuadrado) entre dos puntos.
 * @param x: primer punto.
 * @param y: segundo punto.
 * @return Valor de la distancia euclidea medida entre los dos puntos.
*/
float DistEuclidea (float x, float y);

/**
 * @brief Calcula la suma total de los elementos de una fila de una matriz dada.
 * @param matriz: puntero a puntero que apunta a la matriz en la que se quiere operar.
 * @param cols: columnas de la matriz.
 * @param fila: fila de la que se quiere calcular la suma total.
 * @return Suma total de la fila dada.
*/
int SumaFila(int **matriz,int cols,int fila);

/**
 * @brief Calcula la suma total de los elementos de una columna de una matriz dada.
 * @param matriz: puntero a puntero que apunta a la matriz en la que se quiere operar.
 * @param fils: filas de la matriz.
 * @param columna: columna de la que se quiere calcular la suma total.
 * @return Suma total de la columna dada.
*/
int SumaCol(int **matriz,int fils,int columna);

/**
 * @brief Imprime de forma adecuada una matriz de confusion.
 * @param confusion: puntero a puntero que apunta a la matriz que se quiere imprimir.
 * @param dim: filas y columnas de la matriz (es cuadrada).
 * @pre dim > 0.
*/
void ImpresionMatrizConfusion(int **confusion,unsigned int dim);

/**
  * @brief Lee de un fichero de mapa de color e inserta los valores en una matriz.
  * La memoria de la matriz queda reservada en el interior.
  * @param fich_map: nombre del fichero de mapa de color.
  * @param num_clases: numero de clases distintas (filas del fichero).
  * @return Puntero a puntero que apunta a la matriz de mapa de color.
*/
int **LeerMapaColor (char *fich_map, unsigned int num_clases);


#endif
